import { REGULAR_ID_CARD } from '../../../likit-lib/lib/regular';

/**
 * 身份证校验
 * @param idCard 身份证号码
 * @returns
 */
function validateIdCard(idCard: string): boolean {
  // 15位和18位身份证号码的正则表达式
  const regularIdCard = REGULAR_ID_CARD;
  // 如果通过该验证，说明身份证格式正确，但准确性还需计算
  if (regularIdCard.test(idCard)) {
    if (idCard.length === 18) {
      // 将前17位加权因子保存在数组里
      const idCardWi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
      // 这是除以11后，可能产生的11位余数、验证码，也保存成数组
      const idCardY = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];
      // 用来保存前17位各自以加权因子后的总和
      let idCardWiSum = 0;
      for (let i = 0; i < 17; i += 1) {
        idCardWiSum += window.parseInt(idCard.substring(i, i + 1), 10) * idCardWi[i];
      }
      // 计算出校验码所在数组的位置
      const idCardMod = idCardWiSum % 11;
      // 得到最后一位身份证号码
      const idCardLast = idCard.substring(17);
      // 如果等于2，则说明校验码是10，身份证号码最后一位应该是X
      if (idCardMod === 2) {
        if (idCardLast === 'X' || idCardLast === 'x') {
          return true;
        }
        return false;
      }
      // 用计算出的验证码与最后一位身份证号码匹配，如果一致，说明通过，否则是无效的身份证号码
      return idCardLast === `${idCardY[idCardMod]}`;
    }
  }
  return false;
}

export { validateIdCard };
export default { validateIdCard };
